from django.shortcuts import render
from django.views import View
from django.http import HttpResponse,JsonResponse
from django_redis import get_redis_connection
from apps.verifications.libs.captcha.captcha import captcha
import random
from celery_tasks.sms_code.tasks import send_smscode
from apps.verifications.libs.yuntongxun.ccp_sms import CCP

# Create your views here.
class ImageView(View):
    """
        获取图片验证码
    """

    def get(self, request, uuid):
        # 1、生成图片验证码
        text, img = captcha.generate_captcha()
        # 2、保存图片验证码
        conn = get_redis_connection('verify')
        conn.setex('img_%s' % uuid, 300, text)
        # content_type指定返回的数据格式
        return HttpResponse(img, content_type='image/jpg')


class SMSCodeView(View):
    def get(self,request,mobile):
        # 补充：频繁发送短信的判断，主要判断两次请求之间的时间间隔是否在一分钟之内，如果在一分钟之内，说明请求过于频繁
        conn = get_redis_connection('verify')
        # 获取标志数据
        flag_data = conn.get('flag_%s' % mobile)
        # 如果获取到标志数据，说明数据为超过有效期，还在60s内，那么两次请求之间的间隔是在60s,请求过于频繁
        if flag_data:
            return JsonResponse({'code': 400, 'errmsg': '请求过于频繁'}, status=400)
        # 获取前端传递的数据
        image_code = request.GET.get('image_code')  # 获取的是用户输入图片验证码
        image_code_id = request.GET.get('image_code_id')
        if not all([image_code, image_code_id]):
            return JsonResponse({'error': '参数不完整'}, status=400)
        # 验证数据
        real_smscode = conn.get('img_%s' % image_code_id)
        real_smscode = real_smscode.decode()
        if real_smscode.lower() != image_code.lower():
            return JsonResponse({'error': '验证码错误'}, status=400)
        # 生成短信验证码
        sms_code = '%06d' % random.randint(0,999999)
        print(sms_code)
        # 保存短信验证码
        # conn.setex('sms_code_%s' % mobile, 300, sms_code)
        # # 增加判断时间间隔的标志数据
        # conn.setex('flag_%s' % mobile, 60, 'flag_data')
        # 使用管道写入数据
        # 使用pipeline()生成管道对象
        pipe = conn.pipeline()
        # 将radis的写入数据的命令存入管道
        pipe.setex('sms_code_%s' % mobile, 300, sms_code)
        pipe.setex('flag_%s' % mobile, 60, 'flag_data')
        # 执行管道命令
        pipe.execute()
        # 发送短信
        # ccp = CCP()
        # ccp.send_template_sms(mobile,[sms_code,300],1)
        send_smscode.delay(mobile,sms_code)
        # 返回结果
        return JsonResponse({'errmsg':'ok'})